// package语句：声明当前类所在的包
// com.itheima.type表示这是一个类型演示相关的类
package com.itheima.type;

// public是访问修饰符，表示这个类可以被任何地方访问
// class关键字用于定义一个类
// TypeDemo1是类名，用于演示Java中的数据类型转换
public class TypeDemo1 {
    // main方法：Java程序的入口点
    // public static void是固定格式
    // String[] args是命令行参数数组
    public static void main(String[] args) {
        // 注释：说明这个程序的目标是认识自动类型转换和强制类型转换
        
        // 定义一个byte类型的变量a，并赋值为12
        // byte是Java中的基本数据类型，范围是-128到127
        byte a = 12;
        
        // 调用print方法，参数是byte类型的变量a
        // 这里发生了自动类型转换：byte -> int
        // 因为方法参数是int类型，而byte的范围小于int
        print(a); // 自动类型转换
        
        // 调用print2方法，参数是byte类型的变量a
        // 这里发生了自动类型转换：byte -> double
        // 因为方法参数是double类型，而byte的范围小于double
        print2(a); // 自动类型转换

        // 打印分隔线，用于区分不同的演示部分
        System.out.println("=====================");

        // 定义一个int类型的变量i，并赋值为20
        // int是Java中的基本数据类型，范围是-2^31到2^31-1
        int i = 20;
        
        // 这行代码被注释掉了，因为会产生编译错误
        // 原因：int类型的范围比byte大，不能直接赋值给byte类型
        // print3(i); // 类型范围大的变量不能直接赋值给类型范围小的变量，会报错的！！
        
        // 注释：解释强制类型转换的语法
        // 强制类型转换：(目标类型)源变量
        
        // 使用强制类型转换将int类型的i转换为byte类型
        // 注意：当int值在byte范围内(-128到127)时，转换是安全的
        byte j = (byte) i; // 强制类型转换
        
        // 调用print3方法，参数是byte类型的变量j
        print3(j);

        // 打印分隔线
        System.out.println("=====================");

        // 定义一个int类型的变量m，并赋值为1500
        // 1500超出了byte类型的范围(-128到127)
        int m = 1500;
        
        // 使用强制类型转换将int类型的m转换为byte类型
        // 由于1500超出byte范围，会发生数据溢出
        byte n = (byte) m;
        
        // 打印原始值1500
        System.out.println(m);
        
        // 打印转换后的值，会显示数据溢出后的结果
        // 1500转换为byte时，实际上是1500 % 256 = 228，但由于byte是有符号的，所以结果是-28
        System.out.println(n); // 出现数据溢出！！

        // 打印分隔线
        System.out.println("=====================");

        // 定义一个double类型的变量k，并赋值为3.14
        // double是Java中的基本数据类型，表示双精度浮点数
        double k = 3.14;
        
        // 使用强制类型转换将double类型的k转换为int类型
        // 浮点数转换为整数时，会直接截断小数部分，不是四舍五入
        int l = (int) k; // 浮点型转换成整数，直接去掉小数部分
        
        // 打印转换后的值，会输出3而不是4
        System.out.println(l); // 3
    }

    // 定义print方法，参数是int类型
    // 这个方法用于演示自动类型转换
    public static void print(int b) {
        // 打印传入的int类型参数
        System.out.println(b);
    }

    // 定义print2方法，参数是double类型
    // 这个方法用于演示自动类型转换
    public static void print2(double c) {
        // 打印传入的double类型参数
        System.out.println(c);
    }

    // 定义print3方法，参数是byte类型
    // 这个方法用于演示强制类型转换
    public static void print3(byte j) {
        // 打印传入的byte类型参数
        System.out.println(j);
    }
}
